package com.todod.common.util;

import java.util.Date;
import java.util.UUID;

import javax.servlet.ServletException;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * 
 * @ClassName: JwtUtil
 * @Description:Jwt工具
 * @author：gsh
 * @date 2019年1月24日
 *
 */
public class JwtUtil {
	final static String key = "fbb3856f91664a648436f373d7707007";// 私钥
	final static long TOKEN_EXP = 1000l * 60 * 60 * 24 * 30;// 过期时间24小时

	final static String xcxKey = "093a480c83684c41b0d8e86852fa6673";// 小程序私钥
	final static long XCX_TOKEN_EXP = 1000l * 60 * 60 * 24 * 30;// 小程序过期时间30天

	/**
	 * 
	 * @Title: getToken
	 * @Description: 获取token
	 * @author：gsh
	 * @date: 2019年1月24日
	 * @param userId 用户id
	 * @return
	 * @return String
	 */
	public static String getToken(String userId) {
		return Jwts.builder().setSubject(UUID.randomUUID().toString()).claim("userId", userId).setIssuedAt(new Date())
				.setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXP)) /* 过期时间 */
				.signWith(SignatureAlgorithm.HS256, key).compact();
	}

	/**
	 * 获取小程序token
	 * 
	 * @Title: getXcxToken
	 * @Description:
	 * @author gsh
	 * @date 2020年4月17日
	 * @param userId
	 * @return
	 */
	public static String getXcxToken(String userId) {
		return Jwts.builder().setSubject(UUID.randomUUID().toString()).claim("userId", userId).setIssuedAt(new Date())
				.setExpiration(new Date(System.currentTimeMillis() + XCX_TOKEN_EXP)) /* 过期时间 */
				.signWith(SignatureAlgorithm.HS256, xcxKey).compact();
	}

	/**
	 * 
	 * @Title: checkToken
	 * @Description: 检查token,只要不正确就会抛出异常
	 * @author：gsh
	 * @date: 2019年1月24日
	 * @param token
	 * @param key
	 * @throws ServletException
	 * @return void
	 */
	public static Claims checkToken(String token, String key) throws ServletException {
		try {
			final Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
			return claims;
		} catch (ExpiredJwtException e1) {
			throw new ServletException("token expired");
		} catch (Exception e) {
			throw new ServletException("other token exception");
		}
	}

	/**
	 * 获取userId
	 * 
	 * @param jwt
	 * @return
	 * @throws ServletException
	 * @throws Exception
	 */
	public static String parseJWT(String token) throws ServletException {
		Claims claims = checkToken(token, key);
		return claims.get("userId").toString();
	}

	/**
	 * 获取userId
	 * 
	 * @param jwt
	 * @return
	 * @throws ServletException
	 * @throws Exception
	 */
	public static String parseXcxJWT(String token) throws ServletException {
		Claims claims = checkToken(token, xcxKey);
		return claims.get("userId").toString();
	}

	public static void main(String[] args) throws ServletException {
		String token = getToken("123456789");
		System.out.println(token);

		Claims claims = checkToken(token, key);
		System.out.println(claims.get("userId").toString());

		String a = UUID.randomUUID().toString().replaceAll("-", "");
		String b = UUID.randomUUID().toString().replaceAll("-", "");

		System.out.println(a);
		System.out.println(b);
	}
}
